﻿#define _CRT_SECURE_NO_WARNINGS 1

//函数指针 --- 指向函数的地址的指针,是指针
//#include<stdio.h>
//int Add(int x,int y)
//{
//	return x + y;
//}
//
//int main()
//{
//	//int (*pf)(int, int) = Add;//函数指针
//	int (*pf)(int, int) = &Add;//函数指针
//	//int ret = pf(3, 4);
//	int ret = (*pf)(3, 4);
//	printf("ret = %d\n", ret);
//
//	return 0;
//}

//函数指针数组 --- 存放函数指针的数组,是数组
//#include<stdio.h>
//int Add(int x,int y)
//{
//	return x + y;
//}
//int Sub(int x, int y)
//{
//	return x - y;
//}
//int Mul(int x, int y)
//{
//	return x * y;
//}
//int Div(int x, int y)
//{
//	return x / y;
//}
//
//int main()
//{
//	int (*pfarr[4])(int, int) = { Add,Sub,Mul,Div };//pfarr就是函数指针数组
//	int i = 0;
//	for (i = 0; i < 4; i++)
//	{
//		int ret = pfarr[i](6, 3);
//		printf("ret = %d\n", ret);
//	}
//
//	return 0;
//}


//函数指针的应用

//实现一个整数计算器,具有加、减、乘、除功能
#include<stdio.h>

int Add(int x, int y)
{
	return x + y;
}
int Sub(int x, int y)
{
	return x - y;
}
int Mul(int x, int y)
{
	return x * y;
}
int Div(int x, int y)
{
	return x / y;
}

void menu()
{
	printf("***********************************\n");
	printf("*******   1.Add     2.Sub     *****\n");
	printf("*******   3.Mul     4.Div     *****\n");
	printf("*******   0.exit               *****\n");
	printf("***********************************\n");
}


//整数计算器的一般实现
//int main()
//{
//	int input = 0;
//	int ret = 0;
//	int x = 0, y = 0;
//	do {
//		menu();
//		printf("请选择:");
//		scanf("%d", &input);
//		switch (input)
//		{
//		case 1:
//			printf("请输入2个操作数:");
//			scanf("%d %d", &x, &y);
//			ret = Add(x, y);
//			printf("%d\n", ret);
//			break;
//		case 2:
//			printf("请输入2个操作数:");
//			scanf("%d %d", &x, &y);
//			ret = Sub(x, y);
//			printf("%d\n", ret);
//			break;
//		case 3:
//			printf("请输入2个操作数:");
//			scanf("%d %d", &x, &y);
//			ret = Mul(x, y);
//			printf("%d\n", ret);
//			break;
//		case 4:
//			printf("请输入2个操作数:");
//			scanf("%d %d", &x, &y);
//			ret = Div(x, y);
//			printf("%d\n", ret);
//			break;
//		case 0:
//			printf("退出计算器\n");
//			break;
//		default:
//			printf("输入错误,重新选择\n");
//			break;
//		}
//	} while (input);
//
//
//	return 0;
//}


//函数指针数组的实现
//int main()
//{
//	int input = 0;
//	int ret = 0;
//	int x = 0, y = 0;
//	int (*pfarr[5])(int, int) = { NULL,Add,Sub,Mul,Div };
//
//	do {
//		menu();
//		printf("请选择:");
//		scanf("%d", &input);
//		if (input >= 1 && input <= 4)
//		{
//			printf("请输入2个操作数:");
//			scanf("%d %d", &x, &y);
//			ret = pfarr[input](x, y);
//			printf("%d\n", ret);
//		}
//		else if (0 == input)
//		{
//			printf("退出计算器\n");
//		}
//		else
//		{
//			printf("输入错误,重新选择\n");
//		}
//
//	} while (input);
//
//
//	return 0;
//}


//回调函数是什么？--- 通过函数指针调⽤的函数
//函数指针的实现
//void calculator(int (*pf)(int,int))
//{
//	int x = 0, y = 0;
//	printf("请输入2个操作数:");
//	scanf("%d %d", &x, &y);
//	int ret = pf(x, y);
//	printf("%d\n", ret);
//}
//int main()
//{
//	int input = 0;
//
//	do {
//		menu();
//		printf("请选择:");
//		scanf("%d", &input);
//		switch (input)
//		{
//		case 1:
//			calculator(Add);
//			break;
//		case 2:
//			calculator(Sub);
//			break;
//		case 3:
//			calculator(Mul);
//			break;
//		case 4:
//			calculator(Div);
//			break;
//		case 0:
//			printf("退出计算器\n");
//			break;
//		default:
//			printf("输入错误,重新选择\n");
//			break;
//		}
//	} while (input);
//
//
//	return 0;
//}




//写一个冒泡排序的函数，对一组整型数据进行排序，排序为升序
//#include<stdio.h>
//
//void bubble_sort(int arr[],int size)
//{
//	int i = 0, j = 0;
//	//趟数
//	for (i = 0; i < size - 1; i++)
//	{
//		//每趟比较的次数
//		for (j = 0; j < size - 1 - i; j++)
//		{
//			if (arr[j] > arr[j + 1])
//			{
//				int tmp = arr[j];
//				arr[j] = arr[j + 1];
//				arr[j + 1] = tmp;
//			}
//		}
//	}
//}
//
//void print_arr(int arr[], int size)
//{
//	int i = 0;
//	for (i = 0; i < size; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//	printf("\n");
//}
//
//int main()
//{
//	int arr[10] = { 9,8,7,6,5,4,3,2,1,0 };
//	int size = sizeof(arr) / sizeof(int);
//	bubble_sort(arr, size);//排为升序
//	print_arr(arr, size);
//
//	return 0;
//}

//qsort --- 快速排序 --- 头文件<stdlib.h>

//void qsort( void* base, //指针,指向要排序的数组的第一个元素
//			size_t num, //待排序数组的元素个数
//			size_t size,//指向数组中每个元素的大小(单位字节)
//			int (*compar)(const void*, const void*));//指向两个比较元素的函数指针


//-> 结构体成员的间接访问操作
//结构体指针->成员名
//#include<stdio.h>
//struct stu
//{
//	char name[20];
//	int age;
//};
//void print(struct stu* s)
//{
//	//printf("name = %s age = %d\n", (*s).name, (*s).age);
//	printf("name = %s age = %d\n", s->name, s->age);
//}
//int main()
//{
//	struct stu s = { "zhangsan",22 };
//	printf("name = %s age = %d\n", s.name, s.age);
//	print(&s);
//
//	return 0;
//}



//qsort 使⽤举例
//#include<stdio.h>
//#include<stdlib.h>
//#include<string.h>
//int cmp_int(const void* p1,const void* p2)
//{
//	return *(int*)p1 - *(int*)p2;
//}
//
//void print_arr(int arr[], int size)
//{
//	int i = 0;
//	for (i = 0; i < size; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//	printf("\n");
//}
//
//void test1()
//{
//	int arr[10] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };
//	int size = sizeof(arr) / sizeof(int);
//
//	qsort(arr, size, sizeof(int), cmp_int);
//
//	print_arr(arr, size);
//}
//
//
//struct stu
//{
//	char name[20];
//	int age;
//};
//
//int cmp_stu_by_name(const void* p1, const void* p2)
//{
//	return strcmp(((struct stu*)p1)->name, ((struct stu*)p2)->name);
//}
//
//int cmp_stu_by_age(const void* p1, const void* p2)
//{
//	return ((struct stu*)p2)->age - ((struct stu*)p1)->age;
//}
//
//void test2()
//{
//	struct stu arr[3] = { {"zhangsan",21},{"lisi",22},{"wangwu",23} };
//	int size = sizeof(arr) / sizeof(struct stu);
//
//	//qsort(arr, size, sizeof(struct stu), cmp_stu_by_name);
//	qsort(arr, size, sizeof(struct stu), cmp_stu_by_age);
//
//}
//
//int main()
//{
//	//test1();//使⽤qsort函数排序整型数据
//
//	test2(); //使⽤qsort排序结构数据
//
//	return 0;
//}



//qsort函数的模拟实现 --- 使⽤回调函数，模拟实现qsort（采⽤冒泡的⽅式）
//#include<stdio.h>
//#include<string.h>
//
//void swap(char* bf1,char* bf2,size_t width)
//{
//	while (width--)
//	{
//		char tmp = *bf1;
//		*bf1 = *bf2;
//		*bf2 = tmp;
//		bf1++;
//		bf2++;
//	}
//}
//
//void bubble_q_sort(void* base,size_t num,size_t width,int (*cmp)(const void*,const void*))
//{
//	int i = 0;
//	for (i = 0; i < num - 1; i++)
//	{
//		int j = 0;
//		for (j = 0; j < num - 1 - i; j++)
//		{
//			if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0)
//			{
//				swap((char*)base + j * width, (char*)base + (j + 1) * width,width);
//			}
//		}
//	}
//}
//
//int cmp_int(const void* p1, const void* p2)
//{
//	return *(int*)p1 - *(int*)p2;
//}
//
//void print_arr(int arr[], size_t size)
//{
//	int i = 0;
//	for (i = 0; i < size; i++)
//	{
//		printf("%d  ", arr[i]);
//	}
//	printf("\n");
//}
//
//void test1()
//{
//	int arr[10] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };
//	size_t size = sizeof(arr) / sizeof(int);
//	bubble_q_sort(arr, size, sizeof(int), cmp_int);
//	print_arr(arr, size);
//}
//
//
//struct stu
//{
//	char name[20];
//	int age;
//};
//
//int cmp_stu_by_name(const void* p1, const void* p2)
//{
//	return strcmp(((struct stu*)p1)->name, ((struct stu*)p2)->name);
//}
//
//int cmp_stu_by_age(const void* p1, const void* p2)
//{
//	return ((struct stu*)p1)->age - ((struct stu*)p2)->age;
//}
//
//void test2()
//{
//	struct stu arr[3] = { {"zhangsan",23},{"wangwu",25},{"lisi",22} };
//	size_t size = sizeof(arr) / sizeof(struct stu);
//
//	//bubble_q_sort(arr, size, sizeof(struct stu), cmp_stu_by_name);
//	bubble_q_sort(arr, size, sizeof(struct stu), cmp_stu_by_age);
//
//}
//
//int main()
//{
//	//test1();//排序整型数据
//
//	test2(); //排序结构数据
//
//	return 0;
//}


//sizeof和strlen的对⽐
//#include <stdio.h>
//void test(int n)
//{
//	printf("test\n");
//}
//int main()
//{
//	int a = 10;
//	test(a);
//	printf("%zd\n", sizeof(a));
//	printf("%zd\n", sizeof a);//证明了sizeof不是函数
//	printf("%zd\n", sizeof(int));
//
//	return 0;
//}


//#include<stdio.h>
//int main()
//{
//	int a = 3;
//	short b = 2;
//	a = b + 2;
//	printf("%zd\n", sizeof(a));//括号内表达式不进行计算
//	printf("%d\n", a);
//
//	return 0;
//}

//strlen 是C语⾔库函数，功能是求字符串⻓度,统计的是 \0 之前字符的个数
#include<stdio.h>
#include<string.h>

//int main()
//{
//	int len = strlen("abcd\0ef");
//	printf("%d\n", len);
//
//	return 0;
//}


//int main()
//{
//	const char* str = "abc\0def";
//	int len = strlen(str);
//	printf("%d\n", len);
//
//	return 0;
//}


int main()
{
	char str[] = {'a','b','c','d'};
	
	printf("%zd\n", strlen(str));

	return 0;
}








